package adminModel

import (
	"time"

	"gorm.io/gorm"
)

type Permissions struct {
	// 主键ID，唯一标识权限记录
	ID uint `gorm:"primaryKey" json:"id"`
	// 创建时间，记录该权限创建的时间戳
	CreatedAt time.Time `json:"created_at"`
	// 更新时间，记录该权限最近一次更新的时间戳
	UpdatedAt time.Time `json:"updated_at"`
	// 软删除时间，存在值表示该记录已被删除
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	// 权限名称，用于展示和人类可读的标识
	Name string `gorm:"size:50;not null;uniqueIndex:idx_name" json:"name"`
	// 权限类型：1-菜单/路由，2-按钮事件，3-外链资源
	Type uint8 `gorm:"type:tinyint;not null;index:idx_type" json:"type"`
	// 权限唯一编码，用于后端逻辑校验（如按编码鉴权）
	Sign string `gorm:"size:50;not null;uniqueIndex:idx_sign" json:"sign"`
	// 权限描述，便于理解该权限的用途
	Description string `gorm:"size:255;not null" json:"description"`
	// 父级ID，构建权限树（0 或空表示顶级）
	ParentID uint `gorm:"not null;default:0;index:idx_parent_id,idx_parent_weight,priority:1" json:"parent_id"`
	// 路由路径（菜单/路由专用），用于中间件按路径进行访问控制
	RoutePath string `gorm:"size:255;index:idx_route_path" json:"route_path"`
	// 前端组件路径（菜单专用），用于页面渲染定位
	ComponentPath string `gorm:"size:255;index:idx_component_path" json:"component_path"`
	// 图标（菜单专用），用于前端菜单或按钮的视觉展示
	Icon string `gorm:"size:100;index:idx_icon" json:"icon"`
	// 排序权重，用于同父级下的显示顺序和树构建排序
	Weight int `gorm:"type:int;not null;default:0;index:idx_parent_weight,priority:2" json:"weight"`
	// 外链地址（外链专用），用于控制外部资源访问
	ExternalURL string `gorm:"size:255;index:idx_external_url" json:"external_url"`
	// 按钮事件（按钮专用），用于控制具体操作权限
	ButtonEvent string `gorm:"size:100;index:idx_button_event" json:"button_event"`
	// HTTP 方法限制（菜单/接口专用）：ANY/GET/POST/PUT/DELETE 等
	HTTPMethod string `gorm:"size:10;not null;default:'ANY';index:idx_http_method" json:"http_method"`
	// 路径匹配模式：0-精确匹配；1-前缀匹配（用于REST或分组路由）
	PathMatch uint8 `gorm:"type:tinyint;not null;default:0" json:"path_match"`
}

// TableName 方法用于定义数据库表的名称
// 这是一个 Member 结构体的指针方法，返回字符串类型的表名
func (*Permissions) TableName() string {
	return "admin_permissions" // 返回数据库中实际的表名 "admin_permissions"
}
